/*
 * Copyright (c) 2023, LXMS (lxinet.cn).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.lxinet.lxms.system.service;

import cn.lxinet.lxms.framework.mybatis.service.SimpleService;
import cn.lxinet.lxms.system.entity.SysRole;
import cn.lxinet.lxms.system.entity.SysUserRole;
import cn.lxinet.lxms.system.mapper.SysUserRoleMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 用户和角色关联表
 *
 * @author zcx
 * @date 2023/07/08
 */
@Slf4j
@Service
public class SysUserRoleService extends SimpleService<SysUserRole> {

    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    @Autowired
    private SysRoleService sysRoleService;

    public List<Long> queryRoleIds(Long userId){
        return sysUserRoleMapper.queryRoleIds(userId);
    }

    public boolean isAdministrator(Long userId){
        return sysUserRoleMapper.isAdministrator(userId) != null;
    }

    public void batchSave(Long userId, List<Long> roleIdList){
        if (roleIdList == null || roleIdList.isEmpty()){
            return;
        }
        //查询存在的岗位，不存在的岗位不做关联关系
        List<SysRole> roleList = sysRoleService.listByIds(roleIdList);
        roleIdList = roleList.stream().map(p -> p.getId()).toList();
        List<SysUserRole> list = new ArrayList<>();
        roleIdList.forEach(roleId -> list.add(new SysUserRole(userId, roleId)));
        batchInsert(list);
    }


    public void batchUpdate(Long userId, List<Long> roleIdList){
        if (roleIdList == null){
            roleIdList = new ArrayList<>();
        }
        Set<Long> dbRoleIds = sysUserRoleMapper.listRoleIdsByUserId(userId);
        //需要删除的数据
        Set<Long> delList = new HashSet<>(dbRoleIds);
        delList.removeAll(roleIdList);
        //需要添加的数据
        Set<Long> addList = new HashSet<>(roleIdList);
        addList.removeAll(dbRoleIds);
        //正常每个人角色不多，遍历删除，如果角色数据会很大，最好改成批量删除
        delList.forEach(roleId -> sysUserRoleMapper.deleteByUserIdAndRoleId(userId, roleId));
        if (!addList.isEmpty()){
            List<SysUserRole> addUserRoleList = new ArrayList<>();
            addList.forEach(roleId -> addUserRoleList.add(new SysUserRole(userId, roleId)));
            batchInsert(addUserRoleList);
        }
    }

    public void delete(Long id){
        //删除数据逻辑处理...

        super.deleteById(id);
    }

    public List<Long> listRoleIdsByUserId(Long userId){
        Set<Long> postIds = sysUserRoleMapper.listRoleIdsByUserId(userId);
        return postIds.stream().toList();
    }
}